package net.model;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

import net.form.processing.descuento.AplicarDescuento;
import net.form.processing.descuento.EvaluadorRubro;

@Entity
@Table(name = "TOLERANCIA_RUBRO")
public class ToleranciaRubro implements Serializable {

	private static final long serialVersionUID = -1699942561728265631L;

	@Id
	@Column(name = "uid")
	@GeneratedValue(strategy = GenerationType.AUTO)
	private Long id;

	/**
	 * Rubro de Calidad
	 */
	@ManyToOne
	@JoinColumn(name = "ID_RUBRO", nullable = true, insertable = false, updatable = false)
	private RubroCalidad rubro;

	/**
	 * Grado
	 */
	@ManyToOne
	@JoinColumn(name = "ID_GRADO", nullable = true, insertable = false, updatable = false)
	private Grado grado;

	/**
	 * Valor minimo o maximo para el grado
	 */
	@Column(name = "valor")
	private Double valor;

	/**
	 * Descuento a aplicar por excedente
	 */
	@Column(name = "descuento")
	private Double descuento;

	public ToleranciaRubro() {
		super();
	}

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public RubroCalidad getRubro() {
		return rubro;
	}

	public void setRubro(RubroCalidad rubro) {
		this.rubro = rubro;
	}

	public Grado getGrado() {
		return grado;
	}

	public void setGrado(Grado grado) {
		this.grado = grado;
	}

	public Double getValor() {
		return valor;
	}

	public void setValor(Double valor) {
		this.valor = valor;
	}

	public Double getDescuento() {
		return descuento;
	}

	public void setDescuento(Double descuento) {
		this.descuento = descuento;
	}

	public EvaluadorRubro getEvaluadorValorRubro() {
		return createEvaluadorValorRubro();
	}

	private EvaluadorRubro createEvaluadorValorRubro() {
		try {
			if (getRubro().getClaseEvaluadorValorRubro() != null) {
				EvaluadorRubro evaluadorRubro = (EvaluadorRubro) Class.forName(
						getRubro().getClaseEvaluadorValorRubro()).newInstance();
				evaluadorRubro.setValor(getValor());
				return evaluadorRubro;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	public AplicarDescuento getEvaluadorDescuento() {
		return createEvaluadorDescuento();
	}

	private AplicarDescuento createEvaluadorDescuento() {
		try {
			if (getRubro().getClaseEvaluadorDescuento() != null) {
				AplicarDescuento evaluadorDescuento = (AplicarDescuento) Class
						.forName(getRubro().getClaseEvaluadorDescuento())
						.newInstance();
				evaluadorDescuento.setDescuento(getDescuento());
				return evaluadorDescuento;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	public boolean equals(Object o) {
		if (o == null)
			return false;
		if (!(o instanceof ToleranciaRubro))
			return false;
		ToleranciaRubro c = (ToleranciaRubro) o;
		if (getGrado() != null && getRubro() != null)
			return getGrado().equals(c.getGrado())
					&& getRubro().equals(c.getRubro());
		return false;
	}

	public String toString() {
		return getGrado() + " - " + getRubro();
	}

	@Override
	public int hashCode() {
		return toString().hashCode();
	}
}
